require = (function () { function r(e, n, t) { function o(i, f) { if (!n[i]) { if (!e[i]) { var c = "function" == typeof require && require; if (!f && c) return c(i, !0); if (u) return u(i, !0); var a = new Error("Cannot find module '" + i + "'"); throw a.code = "MODULE_NOT_FOUND", a } var p = n[i] = { exports: {} }; e[i][0].call(p.exports, function (r) { var n = e[i][1][r]; return o(n || r) }, p, p.exports, r, e, n, t) } return n[i].exports } for (var u = "function" == typeof require && require, i = 0; i < t.length; i++)o(t[i]); return o } return r })()({
  1: [function (require, module, exports) {
    window.utilities = {
      scrollTop: function () {
        var supportPageOffset = window.pageXOffset !== undefined;
        var isCSS1Compat = ((document.compatMode || "") === "CSS1Compat");
        var scrollLeft = supportPageOffset ? window.pageXOffset : isCSS1Compat ? document.documentElement.scrollLeft : document.body.scrollLeft;
        return supportPageOffset ? window.pageYOffset : isCSS1Compat ? document.documentElement.scrollTop : document.body.scrollTop;
      },

      // Modified from https://stackoverflow.com/a/27078401
      throttle: function (func, wait, options) {
        var context, args, result;
        var timeout = null;
        var previous = 0;
        if (!options) options = {};
        var later = function () {
          previous = options.leading === false ? 0 : Date.now();
          timeout = null;
          result = func.apply(context, args);
          if (!timeout) context = args = null;
        };
        return function () {
          var now = Date.now();
          if (!previous && options.leading === false) previous = now;
          var remaining = wait - (now - previous);
          context = this;
          args = arguments;
          if (remaining <= 0 || remaining > wait) {
            if (timeout) {
              clearTimeout(timeout);
              timeout = null;
            }
            previous = now;
            result = func.apply(context, args);
            if (!timeout) context = args = null;
          } else if (!timeout && options.trailing !== false) {
            timeout = setTimeout(later, remaining);
          }
          return result;
        };
      },

      closest: function (el, selector) {
        var matchesFn;

        // find vendor prefix
        ['matches', 'webkitMatchesSelector', 'mozMatchesSelector', 'msMatchesSelector', 'oMatchesSelector'].some(function (fn) {
          if (typeof document.body[fn] == 'function') {
            matchesFn = fn;
            return true;
          }
          return false;
        });

        var parent;

        // traverse parents
        while (el) {
          parent = el.parentElement;
          if (parent && parent[matchesFn](selector)) {
            return parent;
          }
          el = parent;
        }

        return null;
      },

      // Modified from https://stackoverflow.com/a/18953277
      offset: function (elem) {
        if (!elem) {
          return;
        }

        rect = elem.getBoundingClientRect();

        // Make sure element is not hidden (display: none) or disconnected
        if (rect.width || rect.height || elem.getClientRects().length) {
          var doc = elem.ownerDocument;
          var docElem = doc.documentElement;

          return {
            top: rect.top + window.pageYOffset - docElem.clientTop,
            left: rect.left + window.pageXOffset - docElem.clientLeft
          };
        }
      },

      headersHeight: function () {
        if (document.getElementById("pytorch-left-menu").classList.contains("make-fixed")) {
          return document.getElementById("pytorch-page-level-bar").offsetHeight;
        } else {
          return document.getElementById("header-holder").offsetHeight +
            document.getElementById("pytorch-page-level-bar").offsetHeight;
        }
      },

      windowHeight: function () {
        return window.innerHeight ||
          document.documentElement.clientHeight ||
          document.body.clientHeight;
      }
    }

  }, {}], 2: [function (require, module, exports) {
    var cookieBanner = {
      init: function () {
        cookieBanner.bind();

        var cookieExists = cookieBanner.cookieExists();

        if (!cookieExists) {
          cookieBanner.setCookie();
          cookieBanner.showCookieNotice();
        }
      },

      bind: function () {
        $(".close-button").on("click", cookieBanner.hideCookieNotice);
      },

      cookieExists: function () {
        var cookie = localStorage.getItem("returningPytorchUser");

        if (cookie) {
          return true;
        } else {
          return false;
        }
      },

      setCookie: function () {
        localStorage.setItem("returningPytorchUser", true);
      },

      showCookieNotice: function () {
        $(".cookie-banner-wrapper").addClass("is-visible");
      },

      hideCookieNotice: function () {
        $(".cookie-banner-wrapper").removeClass("is-visible");
      }
    };

    $(function () {
      cookieBanner.init();
    });

  }, {}], 3: [function (require, module, exports) {
    window.filterTags = {
      bind: function () {
        var options = {
          valueNames: [{ data: ["tags"] }],
          page: "6",
          pagination: true
        };

        var tutorialList = new List("tutorial-cards", options);

        function filterSelectedTags(cardTags, selectedTags) {
          return cardTags.some(function (tag) {
            return selectedTags.some(function (selectedTag) {
              return selectedTag == tag;
            });
          });
        }

        function updateList() {
          var selectedTags = [];

          $(".selected").each(function () {
            selectedTags.push($(this).data("tag"));
          });

          tutorialList.filter(function (item) {
            var cardTags;

            if (item.values().tags == null) {
              cardTags = [""];
            } else {
              cardTags = item.values().tags.split(",");
            }

            if (selectedTags.length == 0) {
              return true;
            } else {
              return filterSelectedTags(cardTags, selectedTags);
            }
          });
        }

        $(".filter-btn").on("click", function () {
          if ($(this).data("tag") == "all") {
            $(this).addClass("all-tag-selected");
            $(".filter").removeClass("selected");
          } else {
            $(this).toggleClass("selected");
            $("[data-tag='all']").removeClass("all-tag-selected");
          }

          // If no tags are selected then highlight the 'All' tag

          if (!$(".selected")[0]) {
            $("[data-tag='all']").addClass("all-tag-selected");
          }

          updateList();
        });
      }
    };

  }, {}], 4: [function (require, module, exports) {
    // Modified from https://stackoverflow.com/a/32396543
    window.highlightNavigation = {
      navigationListItems: document.querySelectorAll("#pytorch-right-menu li"),
      sections: document.querySelectorAll(".pytorch-article .section"),
      sectionIdTonavigationLink: {},

      bind: function () {
        if (!sideMenus.displayRightMenu) {
          return;
        };

        for (var i = 0; i < highlightNavigation.sections.length; i++) {
          var id = highlightNavigation.sections[i].id;
          highlightNavigation.sectionIdTonavigationLink[id] =
            document.querySelectorAll('#pytorch-right-menu li a[href="#' + id + '"]')[0];
        }

        $(window).scroll(utilities.throttle(highlightNavigation.highlight, 100));
      },

      highlight: function () {
        var rightMenu = document.getElementById("pytorch-right-menu");

        // If right menu is not on the screen don't bother
        if (rightMenu.offsetWidth === 0 && rightMenu.offsetHeight === 0) {
          return;
        }

        var scrollPosition = utilities.scrollTop();
        var OFFSET_TOP_PADDING = 25;
        var offset = document.getElementById("header-holder").offsetHeight +
          document.getElementById("pytorch-page-level-bar").offsetHeight +
          OFFSET_TOP_PADDING;

        var sections = highlightNavigation.sections;

        for (var i = (sections.length - 1); i >= 0; i--) {
          var currentSection = sections[i];
          var sectionTop = utilities.offset(currentSection).top;

          if (scrollPosition >= sectionTop - offset) {
            var navigationLink = highlightNavigation.sectionIdTonavigationLink[currentSection.id];
            var navigationListItem = utilities.closest(navigationLink, "li");

            if (navigationListItem && !navigationListItem.classList.contains("active")) {
              for (var i = 0; i < highlightNavigation.navigationListItems.length; i++) {
                var el = highlightNavigation.navigationListItems[i];
                if (el.classList.contains("active")) {
                  el.classList.remove("active");
                }
              }

              navigationListItem.classList.add("active");

              // Scroll to active item. Not a requested feature but we could revive it. Needs work.

              // var menuTop = $("#pytorch-right-menu").position().top;
              // var itemTop = navigationListItem.getBoundingClientRect().top;
              // var TOP_PADDING = 20
              // var newActiveTop = $("#pytorch-side-scroll-right").scrollTop() + itemTop - menuTop - TOP_PADDING;

              // $("#pytorch-side-scroll-right").animate({
              //   scrollTop: newActiveTop
              // }, 100);
            }

            break;
          }
        }
      }
    };

  }, {}], 5: [function (require, module, exports) {
    window.mainMenuDropdown = {
      bind: function () {
        $("[data-toggle='ecosystem-dropdown']").on("click", function () {
          toggleDropdown($(this).attr("data-toggle"));
        });

        $("[data-toggle='resources-dropdown']").on("click", function () {
          toggleDropdown($(this).attr("data-toggle"));
        });

        function toggleDropdown(menuToggle) {
          var showMenuClass = "show-menu";
          var menuClass = "." + menuToggle + "-menu";

          if ($(menuClass).hasClass(showMenuClass)) {
            $(menuClass).removeClass(showMenuClass);
          } else {
            $("[data-toggle=" + menuToggle + "].show-menu").removeClass(
              showMenuClass
            );
            $(menuClass).addClass(showMenuClass);
          }
        }
      }
    };

  }, {}], 6: [function (require, module, exports) {
    window.mobileMenu = {
      bind: function () {
        $("[data-behavior='open-mobile-menu']").on('click', function (e) {
          e.preventDefault();
          $(".mobile-main-menu").addClass("open");
          $("body").addClass('no-scroll');

          mobileMenu.listenForResize();
        });

        $("[data-behavior='close-mobile-menu']").on('click', function (e) {
          e.preventDefault();
          mobileMenu.close();
        });
      },

      listenForResize: function () {
        $(window).on('resize.ForMobileMenu', function () {
          if ($(this).width() > 768) {
            mobileMenu.close();
          }
        });
      },

      close: function () {
        $(".mobile-main-menu").removeClass("open");
        $("body").removeClass('no-scroll');
        $(window).off('resize.ForMobileMenu');
      }
    };

  }, {}], 7: [function (require, module, exports) {
    window.mobileTOC = {
      bind: function () {
        $("[data-behavior='toggle-table-of-contents']").on("click", function (e) {
          e.preventDefault();

          var $parent = $(this).parent();

          if ($parent.hasClass("is-open")) {
            $parent.removeClass("is-open");
            $(".pytorch-left-menu").slideUp(200, function () {
              $(this).css({ display: "" });
            });
          } else {
            $parent.addClass("is-open");
            $(".pytorch-left-menu").slideDown(200);
          }
        });
      }
    }

  }, {}], 8: [function (require, module, exports) {
    window.pytorchAnchors = {
      bind: function () {
        // Replace Sphinx-generated anchors with anchorjs ones
        $(".headerlink").text("");

        window.anchors.add(".pytorch-article .headerlink");

        $(".anchorjs-link").each(function () {
          var $headerLink = $(this).closest(".headerlink");
          var href = $headerLink.attr("href");
          var clone = this.outerHTML;

          $clone = $(clone).attr("href", href);
          $headerLink.before($clone);
          $headerLink.remove();
        });
      }
    };

  }, {}], 9: [function (require, module, exports) {
    // Modified from https://stackoverflow.com/a/13067009
    // Going for a JS solution to scrolling to an anchor so we can benefit from
    // less hacky css and smooth scrolling.

    window.scrollToAnchor = {
      bind: function () {
        var document = window.document;
        var history = window.history;
        var location = window.location
        var HISTORY_SUPPORT = !!(history && history.pushState);

        var anchorScrolls = {
          ANCHOR_REGEX: /^#[^ ]+$/,
          offsetHeightPx: function () {
            var OFFSET_HEIGHT_PADDING = 20;
            // TODO: this is a little janky. We should try to not rely on JS for this
            return utilities.headersHeight() + OFFSET_HEIGHT_PADDING;
          },

          /**
           * Establish events, and fix initial scroll position if a hash is provided.
           */
          init: function () {
            this.scrollToCurrent();
            // This interferes with clicks below it, causing a double fire
            // $(window).on('hashchange', $.proxy(this, 'scrollToCurrent'));
            $('body').on('click', 'a', $.proxy(this, 'delegateAnchors'));
            $('body').on('click', '#pytorch-right-menu li span', $.proxy(this, 'delegateSpans'));
          },

          /**
           * Return the offset amount to deduct from the normal scroll position.
           * Modify as appropriate to allow for dynamic calculations
           */
          getFixedOffset: function () {
            return this.offsetHeightPx();
          },

          /**
           * If the provided href is an anchor which resolves to an element on the
           * page, scroll to it.
           * @param  {String} href
           * @return {Boolean} - Was the href an anchor.
           */
          scrollIfAnchor: function (href, pushToHistory) {
            var match, anchorOffset;

            if (!this.ANCHOR_REGEX.test(href)) {
              return false;
            }

            match = document.getElementById(href.slice(1));

            if (match) {
              var anchorOffset = $(match).offset().top - this.getFixedOffset();

              $('html, body').scrollTop(anchorOffset);

              // Add the state to history as-per normal anchor links
              if (HISTORY_SUPPORT && pushToHistory) {
                history.pushState({}, document.title, location.pathname + href);
              }
            }

            return !!match;
          },

          /**
           * Attempt to scroll to the current location's hash.
           */
          scrollToCurrent: function (e) {
            if (this.scrollIfAnchor(window.location.hash) && e) {
              e.preventDefault();
            }
          },

          delegateSpans: function (e) {
            var elem = utilities.closest(e.target, "a");

            if (this.scrollIfAnchor(elem.getAttribute('href'), true)) {
              e.preventDefault();
            }
          },

          /**
           * If the click event's target was an anchor, fix the scroll position.
           */
          delegateAnchors: function (e) {
            var elem = e.target;

            if (this.scrollIfAnchor(elem.getAttribute('href'), true)) {
              e.preventDefault();
            }
          }
        };

        $(document).ready($.proxy(anchorScrolls, 'init'));
      }
    };

  }, {}], 10: [function (require, module, exports) {
    window.sideMenus = {
      rightMenuIsOnScreen: function () {
        return document.getElementById("pytorch-content-right").offsetParent !== null;
      },

      isFixedToBottom: false,

      bind: function () {
        sideMenus.handleLeftMenu();

        var rightMenuLinks = document.querySelectorAll("#pytorch-right-menu li");
        var rightMenuHasLinks = rightMenuLinks.length > 1;

        if (!rightMenuHasLinks) {
          for (var i = 0; i < rightMenuLinks.length; i++) {
            rightMenuLinks[i].style.display = "none";
          }
        }

        if (rightMenuHasLinks) {
          // Don't show the Shortcuts menu title text unless there are menu items
          document.getElementById("pytorch-shortcuts-wrapper").style.display = "block";

          // We are hiding the titles of the pages in the right side menu but there are a few
          // pages that include other pages in the right side menu (see 'torch.nn' in the docs)
          // so if we exclude those it looks confusing. Here we add a 'title-link' class to these
          // links so we can exclude them from normal right side menu link operations
          var titleLinks = document.querySelectorAll(
            "#pytorch-right-menu #pytorch-side-scroll-right \
         > ul > li > a.reference.internal"
          );

          for (var i = 0; i < titleLinks.length; i++) {
            var link = titleLinks[i];

            link.classList.add("title-link");

            if (
              link.nextElementSibling &&
              link.nextElementSibling.tagName === "UL" &&
              link.nextElementSibling.children.length > 0
            ) {
              link.classList.add("has-children");
            }
          }

          // Add + expansion signifiers to normal right menu links that have sub menus
          var menuLinks = document.querySelectorAll(
            "#pytorch-right-menu ul li ul li a.reference.internal"
          );

          for (var i = 0; i < menuLinks.length; i++) {
            if (
              menuLinks[i].nextElementSibling &&
              menuLinks[i].nextElementSibling.tagName === "UL"
            ) {
              menuLinks[i].classList.add("not-expanded");
            }
          }

          // If a hash is present on page load recursively expand menu items leading to selected item
          var linkWithHash =
            document.querySelector(
              "#pytorch-right-menu a[href=\"" + window.location.hash + "\"]"
            );

          if (linkWithHash) {
            // Expand immediate sibling list if present
            if (
              linkWithHash.nextElementSibling &&
              linkWithHash.nextElementSibling.tagName === "UL" &&
              linkWithHash.nextElementSibling.children.length > 0
            ) {
              linkWithHash.nextElementSibling.style.display = "block";
              linkWithHash.classList.add("expanded");
            }

            // Expand ancestor lists if any
            sideMenus.expandClosestUnexpandedParentList(linkWithHash);
          }

          // Bind click events on right menu links
          $("#pytorch-right-menu a.reference.internal").on("click", function () {
            if (this.classList.contains("expanded")) {
              this.nextElementSibling.style.display = "none";
              this.classList.remove("expanded");
              this.classList.add("not-expanded");
            } else if (this.classList.contains("not-expanded")) {
              this.nextElementSibling.style.display = "block";
              this.classList.remove("not-expanded");
              this.classList.add("expanded");
            }
          });

          sideMenus.handleRightMenu();
        }

        $(window).on('resize scroll', function (e) {
          sideMenus.handleNavBar();

          sideMenus.handleLeftMenu();

          if (sideMenus.rightMenuIsOnScreen()) {
            sideMenus.handleRightMenu();
          }
        });
      },

      leftMenuIsFixed: function () {
        return document.getElementById("pytorch-left-menu").classList.contains("make-fixed");
      },

      handleNavBar: function () {
        var mainHeaderHeight = document.getElementById('header-holder').offsetHeight;

        // If we are scrolled past the main navigation header fix the sub menu bar to top of page
        if (utilities.scrollTop() >= mainHeaderHeight) {
          document.getElementById("pytorch-left-menu").classList.add("make-fixed");
          document.getElementById("pytorch-page-level-bar").classList.add("left-menu-is-fixed");
        } else {
          document.getElementById("pytorch-left-menu").classList.remove("make-fixed");
          document.getElementById("pytorch-page-level-bar").classList.remove("left-menu-is-fixed");
        }
      },

      expandClosestUnexpandedParentList: function (el) {
        var closestParentList = utilities.closest(el, "ul");

        if (closestParentList) {
          var closestParentLink = closestParentList.previousElementSibling;
          var closestParentLinkExists = closestParentLink &&
            closestParentLink.tagName === "A" &&
            closestParentLink.classList.contains("reference");

          if (closestParentLinkExists) {
            // Don't add expansion class to any title links
            if (closestParentLink.classList.contains("title-link")) {
              return;
            }

            closestParentList.style.display = "block";
            closestParentLink.classList.remove("not-expanded");
            closestParentLink.classList.add("expanded");
            sideMenus.expandClosestUnexpandedParentList(closestParentLink);
          }
        }
      },

      handleLeftMenu: function () {
        var windowHeight = utilities.windowHeight();
        var topOfFooterRelativeToWindow = document.getElementById("docs-tutorials-resources").getBoundingClientRect().top;

        if (topOfFooterRelativeToWindow >= windowHeight) {
          document.getElementById("pytorch-left-menu").style.height = "100%";
        } else {
          var howManyPixelsOfTheFooterAreInTheWindow = windowHeight - topOfFooterRelativeToWindow;
          var leftMenuDifference = howManyPixelsOfTheFooterAreInTheWindow;
          document.getElementById("pytorch-left-menu").style.height = (windowHeight - leftMenuDifference) + "px";
        }
      },

      handleRightMenu: function () {
        var rightMenuWrapper = document.getElementById("pytorch-content-right");
        var rightMenu = document.getElementById("pytorch-right-menu");
        var rightMenuList = rightMenu.getElementsByTagName("ul")[0];
        var article = document.getElementById("pytorch-article");
        var articleHeight = article.offsetHeight;
        var articleBottom = utilities.offset(article).top + articleHeight;
        var mainHeaderHeight = document.getElementById('header-holder').offsetHeight;

        if (utilities.scrollTop() < mainHeaderHeight) {
          rightMenuWrapper.style.height = "100%";
          rightMenu.style.top = 0;
          rightMenu.classList.remove("scrolling-fixed");
          rightMenu.classList.remove("scrolling-absolute");
        } else {
          if (rightMenu.classList.contains("scrolling-fixed")) {
            var rightMenuBottom =
              utilities.offset(rightMenuList).top + rightMenuList.offsetHeight;

            if (rightMenuBottom >= articleBottom) {
              rightMenuWrapper.style.height = articleHeight + mainHeaderHeight + "px";
              rightMenu.style.top = utilities.scrollTop() - mainHeaderHeight + "px";
              rightMenu.classList.add("scrolling-absolute");
              rightMenu.classList.remove("scrolling-fixed");
            }
          } else {
            rightMenuWrapper.style.height = articleHeight + mainHeaderHeight + "px";
            rightMenu.style.top =
              articleBottom - mainHeaderHeight - rightMenuList.offsetHeight + "px";
            rightMenu.classList.add("scrolling-absolute");
          }

          if (utilities.scrollTop() < articleBottom - rightMenuList.offsetHeight) {
            rightMenuWrapper.style.height = "100%";
            rightMenu.style.top = "";
            rightMenu.classList.remove("scrolling-absolute");
            rightMenu.classList.add("scrolling-fixed");
          }
        }

        var rightMenuSideScroll = document.getElementById("pytorch-side-scroll-right");
        var sideScrollFromWindowTop = rightMenuSideScroll.getBoundingClientRect().top;

        rightMenuSideScroll.style.height = utilities.windowHeight() - sideScrollFromWindowTop + "px";
      }
    };

  }, {}], "pytorch-sphinx-theme": [function (require, module, exports) {
    var jQuery = (typeof (window) != 'undefined') ? window.jQuery : require('jquery');

    // Sphinx theme nav state
    function ThemeNav() {

      var nav = {
        navBar: null,
        win: null,
        winScroll: false,
        winResize: false,
        linkScroll: false,
        winPosition: 0,
        winHeight: null,
        docHeight: null,
        isRunning: false
      };

      nav.enable = function (withStickyNav) {
        var self = this;

        // TODO this can likely be removed once the theme javascript is broken
        // out from the RTD assets. This just ensures old projects that are
        // calling `enable()` get the sticky menu on by default. All other cals
        // to `enable` should include an argument for enabling the sticky menu.
        if (typeof (withStickyNav) == 'undefined') {
          withStickyNav = true;
        }

        if (self.isRunning) {
          // Only allow enabling nav logic once
          return;
        }

        self.isRunning = true;
        jQuery(function ($) {
          self.init($);

          self.reset();
          self.win.on('hashchange', self.reset);

          if (withStickyNav) {
            // Set scroll monitor
            self.win.on('scroll', function () {
              if (!self.linkScroll) {
                if (!self.winScroll) {
                  self.winScroll = true;
                  requestAnimationFrame(function () { self.onScroll(); });
                }
              }
            });
          }

          // Set resize monitor
          self.win.on('resize', function () {
            if (!self.winResize) {
              self.winResize = true;
              requestAnimationFrame(function () { self.onResize(); });
            }
          });

          self.onResize();
        });

      };

      // TODO remove this with a split in theme and Read the Docs JS logic as
      // well, it's only here to support 0.3.0 installs of our theme.
      nav.enableSticky = function () {
        this.enable(true);
      };

      nav.init = function ($) {
        var doc = $(document),
          self = this;

        this.navBar = $('div.pytorch-side-scroll:first');
        this.win = $(window);

        // Set up javascript UX bits
        $(document)
          // Shift nav in mobile when clicking the menu.
          .on('click', "[data-toggle='pytorch-left-menu-nav-top']", function () {
            $("[data-toggle='wy-nav-shift']").toggleClass("shift");
            $("[data-toggle='rst-versions']").toggleClass("shift");
          })

          // Nav menu link click operations
          .on('click', ".pytorch-menu-vertical .current ul li a", function () {
            var target = $(this);
            // Close menu when you click a link.
            $("[data-toggle='wy-nav-shift']").removeClass("shift");
            $("[data-toggle='rst-versions']").toggleClass("shift");
            // Handle dynamic display of l3 and l4 nav lists
            self.toggleCurrent(target);
            self.hashChange();
          })
          .on('click', "[data-toggle='rst-current-version']", function () {
            $("[data-toggle='rst-versions']").toggleClass("shift-up");
          })

        // Make tables responsive
        $("table.docutils:not(.field-list,.footnote,.citation)")
          .wrap("<div class='wy-table-responsive'></div>");

        // Add extra class to responsive tables that contain
        // footnotes or citations so that we can target them for styling
        $("table.docutils.footnote")
          .wrap("<div class='wy-table-responsive footnote'></div>");
        $("table.docutils.citation")
          .wrap("<div class='wy-table-responsive citation'></div>");

        // Add expand links to all parents of nested ul
        $('.pytorch-menu-vertical ul').not('.simple').siblings('a').each(function () {
          var link = $(this);
          expand = $('<span class="toctree-expand"></span>');
          expand.on('click', function (ev) {
            self.toggleCurrent(link);
            ev.stopPropagation();
            return false;
          });
          link.prepend(expand);
        });
      };

      nav.reset = function () {
        // Get anchor from URL and open up nested nav
        var anchor = encodeURI(window.location.hash) || '#';

        try {
          var vmenu = $('.pytorch-menu-vertical');
          var link = vmenu.find('[href="' + anchor + '"]');
          if (link.length === 0) {
            // this link was not found in the sidebar.
            // Find associated id element, then its closest section
            // in the document and try with that one.
            var id_elt = $('.document [id="' + anchor.substring(1) + '"]');
            var closest_section = id_elt.closest('div.section');
            link = vmenu.find('[href="#' + closest_section.attr("id") + '"]');
            if (link.length === 0) {
              // still not found in the sidebar. fall back to main section
              link = vmenu.find('[href="#"]');
            }
          }
          // If we found a matching link then reset current and re-apply
          // otherwise retain the existing match
          if (link.length > 0) {
            $('.pytorch-menu-vertical .current').removeClass('current');
            link.addClass('current');
            link.closest('li.toctree-l1').addClass('current');
            link.closest('li.toctree-l1').parent().addClass('current');
            link.closest('li.toctree-l1').addClass('current');
            link.closest('li.toctree-l2').addClass('current');
            link.closest('li.toctree-l3').addClass('current');
            link.closest('li.toctree-l4').addClass('current');
          }
        }
        catch (err) {
          console.log("Error expanding nav for anchor", err);
        }

      };

      nav.onScroll = function () {
        // this.winScroll = false;
        // var newWinPosition = this.win.scrollTop(),
        //     winBottom = newWinPosition + this.winHeight,
        //     navPosition = this.navBar.scrollTop(),
        //     newNavPosition = navPosition + (newWinPosition - this.winPosition);
        // if (newWinPosition < 0 || winBottom > this.docHeight) {
        //     return;
        // }
        // this.navBar.scrollTop(newNavPosition);
        // this.winPosition = newWinPosition;
      };

      nav.onResize = function () {
        this.winResize = false;
        this.winHeight = this.win.height();
        this.docHeight = $(document).height();
      };

      nav.hashChange = function () {
        this.linkScroll = true;
        this.win.one('hashchange', function () {
          this.linkScroll = false;
        });
      };

      nav.toggleCurrent = function (elem) {
        var parent_li = elem.closest('li');
        parent_li.siblings('li.current').removeClass('current');
        parent_li.siblings().find('li.current').removeClass('current');
        parent_li.find('> ul li.current').removeClass('current');
        parent_li.toggleClass('current');
      }

      return nav;
    };

    module.exports.ThemeNav = ThemeNav();

    if (typeof (window) != 'undefined') {
      window.SphinxRtdTheme = {
        Navigation: module.exports.ThemeNav,
        // TODO remove this once static assets are split up between the theme
        // and Read the Docs. For now, this patches 0.3.0 to be backwards
        // compatible with a pre-0.3.0 layout.html
        StickyNav: module.exports.ThemeNav,
      };
    }


    // requestAnimationFrame polyfill by Erik Möller. fixes from Paul Irish and Tino Zijdel
    // https://gist.github.com/paulirish/1579671
    // MIT license

    (function () {
      var lastTime = 0;
      var vendors = ['ms', 'moz', 'webkit', 'o'];
      for (var x = 0; x < vendors.length && !window.requestAnimationFrame; ++x) {
        window.requestAnimationFrame = window[vendors[x] + 'RequestAnimationFrame'];
        window.cancelAnimationFrame = window[vendors[x] + 'CancelAnimationFrame']
          || window[vendors[x] + 'CancelRequestAnimationFrame'];
      }

      if (!window.requestAnimationFrame)
        window.requestAnimationFrame = function (callback, element) {
          var currTime = new Date().getTime();
          var timeToCall = Math.max(0, 16 - (currTime - lastTime));
          var id = window.setTimeout(function () { callback(currTime + timeToCall); },
            timeToCall);
          lastTime = currTime + timeToCall;
          return id;
        };

      if (!window.cancelAnimationFrame)
        window.cancelAnimationFrame = function (id) {
          clearTimeout(id);
        };
    }());

    $(".sphx-glr-thumbcontainer").removeAttr("tooltip");
    $("table").removeAttr("border");

    // This code replaces the default sphinx gallery download buttons
    // with the 3 download buttons at the top of the page

    var downloadNote = $(".sphx-glr-download-link-note.admonition.note");
    if (downloadNote.length >= 1) {
      var tutorialUrlArray = $("#tutorial-type").text().split('/');
      tutorialUrlArray[0] = tutorialUrlArray[0] + "_source"

      var githubLink = "https://github.com/pytorch/tutorials/blob/master/" + tutorialUrlArray.join("/") + ".py",
        notebookLink = $(".reference.download")[1].href,
        notebookDownloadPath = notebookLink.split('_downloads')[1],
        colabLink = "https://colab.research.google.com/github/pytorch/tutorials/blob/gh-pages/_downloads" + notebookDownloadPath;

      $("#google-colab-link").wrap("<a href=" + colabLink + " data-behavior='call-to-action-event' data-response='Run in Google Colab' target='_blank'/>");
      $("#download-notebook-link").wrap("<a href=" + notebookLink + " data-behavior='call-to-action-event' data-response='Download Notebook'/>");
      $("#github-view-link").wrap("<a href=" + githubLink + " data-behavior='call-to-action-event' data-response='View on Github' target='_blank'/>");
    } else {
      $(".pytorch-call-to-action-links").hide();
    }

    //This code handles the Expand/Hide toggle for the Docs/Tutorials left nav items

    $(document).ready(function () {
      var caption = "#pytorch-left-menu p.caption";
      var collapseAdded = $(this).not("checked");
      $(caption).each(function () {
        var menuName = this.innerText.replace(/[^\w\s]/gi, "").trim();
        $(this).find("span").addClass("checked");
        if (collapsedSections.includes(menuName) == true && collapseAdded && sessionStorage.getItem(menuName) !== "expand" || sessionStorage.getItem(menuName) == "collapse") {
          $(this.firstChild).after("<span class='expand-menu'>[ + ]</span>");
          $(this.firstChild).after("<span class='hide-menu collapse'>[ - ]</span>");
          $(this).next("ul").hide();
        } else if (collapsedSections.includes(menuName) == false && collapseAdded || sessionStorage.getItem(menuName) == "expand") {
          $(this.firstChild).after("<span class='expand-menu collapse'>[ + ]</span>");
          $(this.firstChild).after("<span class='hide-menu'>[ - ]</span>");
        }
      });

      $(".expand-menu").on("click", function () {
        $(this).prev(".hide-menu").toggle();
        $(this).parent().next("ul").toggle();
        var menuName = $(this).parent().text().replace(/[^\w\s]/gi, "").trim();
        if (sessionStorage.getItem(menuName) == "collapse") {
          sessionStorage.removeItem(menuName);
        }
        sessionStorage.setItem(menuName, "expand");
        toggleList(this);
      });

      $(".hide-menu").on("click", function () {
        $(this).next(".expand-menu").toggle();
        $(this).parent().next("ul").toggle();
        var menuName = $(this).parent().text().replace(/[^\w\s]/gi, "").trim();
        if (sessionStorage.getItem(menuName) == "expand") {
          sessionStorage.removeItem(menuName);
        }
        sessionStorage.setItem(menuName, "collapse");
        toggleList(this);
      });

      function toggleList(menuCommand) {
        $(menuCommand).toggle();
      }
    });

    // Build an array from each tag that's present

    var tagList = $(".tutorials-card-container").map(function () {
      return $(this).data("tags").split(",").map(function (item) {
        return item.trim();
      });
    }).get();

    function unique(value, index, self) {
      return self.indexOf(value) == index && value != ""
    }

    // Only return unique tags

    var tags = tagList.sort().filter(unique);

    // Add filter buttons to the top of the page for each tag

    function createTagMenu() {
      tags.forEach(function (item) {
        $(".tutorial-filter-menu").append(" <div class='tutorial-filter filter-btn filter' data-tag='" + item + "'>" + item + "</div>")
      })
    };

    createTagMenu();

    // Remove hyphens if they are present in the filter buttons

    $(".tags").each(function () {
      var tags = $(this).text().split(",");
      tags.forEach(function (tag, i) {
        tags[i] = tags[i].replace(/-/, ' ')
      })
      $(this).html(tags.join(", "));
    });

    // Remove hyphens if they are present in the card body

    $(".tutorial-filter").each(function () {
      var tag = $(this).text();
      $(this).html(tag.replace(/-/, ' '))
    })

    // Remove any empty p tags that Sphinx adds

    $("#tutorial-cards p").each(function (index, item) {
      if (!$(item).text().trim()) {
        $(item).remove();
      }
    });

    // Jump back to top on pagination click

    $(document).on("click", ".page", function () {
      $('html, body').animate(
        { scrollTop: $("#dropdown-filter-tags").position().top },
        'slow'
      );
    });

    var link = $("a[href='intermediate/speech_command_recognition_with_torchaudio.html']");

    if (link.text() == "SyntaxError") {
      console.log("There is an issue with the intermediate/speech_command_recognition_with_torchaudio.html menu item.");
      link.text("Speech Command Recognition with torchaudio");
    }

    $(".stars-outer > i").hover(function () {
      $(this).prevAll().addBack().toggleClass("fas star-fill");
    });

    $(".stars-outer > i").on("click", function () {
      $(this).prevAll().each(function () {
        $(this).addBack().addClass("fas star-fill");
      });

      $(".stars-outer > i").each(function () {
        $(this).unbind("mouseenter mouseleave").css({
          "pointer-events": "none"
        });
      });
    })

    $("#pytorch-side-scroll-right li a").on("click", function (e) {
      var href = $(this).attr("href");
      $('html, body').stop().animate({
        scrollTop: $(href).offset().top - 100
      }, 850);
      e.preventDefault;
    });

    var lastId,
      topMenu = $("#pytorch-side-scroll-right"),
      topMenuHeight = topMenu.outerHeight() + 1,
      // All sidenav items
      menuItems = topMenu.find("a"),
      // Anchors for menu items
      scrollItems = menuItems.map(function () {
        var item = $(this).attr("href");
        if (item.length) {
          return item;
        }
      });

    $(window).scroll(function () {
      var fromTop = $(this).scrollTop() + topMenuHeight;
      var article = ".section";

      $(article).each(function (i) {
        var offsetScroll = $(this).offset().top - $(window).scrollTop();
        if (
          offsetScroll <= topMenuHeight + 200 &&
          offsetScroll >= topMenuHeight - 200 &&
          scrollItems[i] == "#" + $(this).attr("id") &&
          $(".hidden:visible")
        ) {
          $(menuItems).removeClass("side-scroll-highlight");
          $(menuItems[i]).addClass("side-scroll-highlight");
        }
      });
    });

  }, { "jquery": "jquery" }]
}, {}, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, "pytorch-sphinx-theme"]);
